/*
 * @param k_f               Faiss(HNSW)构建参数：邻居节点数
 * @param efs               Faiss(HNSW)搜索参数：候选节点列表大小
 * @param efc               Faiss(HNSW)构建参数：候选节点列表大小
 * @param qbs               Faiss(HNSW)构建参数：向量量化位数（KPRetrieval可选）
 * @param metric            Faiss(HNSW)构建参数：距离度量类型
 * @param index             Faiss(HNSW)索引
 * @param hnsw_params       Faiss(HNSW)hnsw参数：用于添加efs
 * @param index_path        索引保存/加载路径
 * @param save_or_load      保存/加载
 */

#ifndef FAISS_HNSW_INDEX_H
#define FAISS_HNSW_INDEX_H

#include "index_base.h"
#include "datasets.h"
#include "config_parser.h"
#include <faiss/IndexHNSW.h>
#include <memory>

class FaissHNSWIndex : public IndexBase {
public:
    FaissHNSWIndex(const ConfigParser& config);
    ~FaissHNSWIndex();
    virtual void build(const Datasets* data) override;
    virtual void prepare_search() override;
    virtual void search_single(const float* xq, int k, float* distances, int64_t* labels) override;
    virtual void search_batch(const int nq, const float* xq, int k, float* distances, int64_t* labels) override;

private:
    int k_f;
    int efs;
    int efc;
#ifdef QUANT
    int qbs;
#endif
    faiss::MetricType metric;
    std::unique_ptr<faiss::IndexHNSWFlat> index;
    faiss::SearchParametersHNSW hnsw_params;
    std::string index_path;
    std::string save_or_load;
};

#endif // FAISS_HNSW_INDEX_H